% 假设AIS数据存储在一个矩阵中，每行包含一个数据点，列分别为 Lon, Lat, Time
% AISData = [Lon1, Lat1, Time1; Lon2, Lat2, Time2; ...];

clc
clear
currentDir = pwd; % 获取当前目录路径
parentDir = fileparts(currentDir); % 获取当前目录的上一级目录路径
% grandParentDir = fileparts(parentDir); % 获取当前目录的上两级目录路径
% greatGrandParentDir = fileparts(grandParentDir); % 获取当前目录的上三级目录路径

%指定需要查找的文件夹
subdir = 'DATA';
%指定需要查找的文件名
filename = '413168000(NoRepeated).mat';%413168000.mat'; %matlab中包含的是剔除
%构造需要查找的文件的完整路径
full_path = fullfile(parentDir, subdir, filename);

load( full_path)  %此处使用的数据是原始org数据经过后面的[]处理后得到的数据

%% 数据预处理
% AIS(AIS.Speed<1,:)=[];%锚泊状态不处理

AISData =table2array( data(:,{'Lon','Lat','time'}));

% 初始化参数
vlimitsp = 13; % 船舶最大速度上限，单位：节
maxTimeDiff = 3*60; % 最大时间间隔，单位：秒

% 计算每两个连续点之间的距离和时间差
n = size(AISData, 1);
distances = zeros(n-1, 1);
timeDiffs = zeros(n-1, 1);

for i = 1:n-1
    % 计算距离
    % distances(i) = calculateDistance(AISData(i, 1), AISData(i, 2), AISData(i+1, 1), AISData(i+1, 2));
    distances(i) =calculate_distance_two_points(AISData(i, 1:2),AISData(i+1, 1:2));
    
    % 计算时间差（单位：秒）
    timeDiffs(i) = abs(AISData(i+1, 3) - AISData(i, 3)) ;
end

% 计算距离的均值和标准差
meanDist = mean(distances);
stdDist = std(distances);

% 识别异常点：距离超过均值+3倍标准差或时间差超过3分钟
outliers = distances > (meanDist + 3*stdDist) |   timeDiffs>(mean(timeDiffs)+3*std(timeDiffs))  ;   %timeDiffs > maxTimeDiff;

% 剔除异常点
cleanedAISData = AISData(~outliers, :);

% 绘制原始轨迹
figure;
plot(AISData(:, 1), AISData(:, 2), 'b.');
hold on;

% 绘制清理后的轨迹
plot(cleanedAISData(:, 1), cleanedAISData(:, 2), 'r.');
legend('Original Trajectory', 'Cleaned Trajectory');
xlabel('Longitude');
ylabel('Latitude');
title('AIS Trajectory with Outliers Removed');
hold off;


fhx.ais_deleted=cleanedAISData;
%计算偏转角标准差,
fhx.degrees_org = calculate_track_degree(AISData(:,1:2));
fhx.degrees_deleted = calculate_track_degree(cleanedAISData(:,1:2));

fhx.mean_org=mean(fhx.degrees_org);
fhx.mean_deleted=mean(fhx.degrees_deleted);
fhx.std_org=std(fhx.degrees_org);
fhx.std_deleted = std(fhx.degrees_deleted);






